import axios from "axios";
import { ElMessageBox, ElMessage } from "element-plus";
import md5 from 'md5'   //md5加密  安装插件  cnpm i md5 -S
import store from '@/store/index.js'
import {
  showLoading,
  hideLoading
} from '@/utils/loading'

const instance = axios.create({
  baseURL: '/api',
  timeout: 50000
});

//实现code-私钥(跟后端协商好的加密串，在请求数据时你头上带着加密串,后端解析是商量好的，就给你返数据)
function getTestICode() {
  const now = parseInt(Date.now() / 1000)
  const code = now + 'LGD_Sunday-1991'
  return {
    icode: md5(code),
    time: now
  }
}


// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  //这个项目后端要求请求头上headers上带着这些配置信息,code码,和日期戳，否则只有token不会返回数据
  const { icode, time } = getTestICode()
  config.headers.icode = icode
  config.headers.codeType = time
  // 在发送请求之前做些什么
  // 开启 loading 效果
  showLoading()
  // 断网提示
  if (!navigator.onLine) {
    ElMessageBox.alert(
      '亲,好像出现了网络错误...',
      '温馨提示', {
      confirmButtonText: '好的',
      type: 'warning'
    }
    )
  }

  // 判断是否存在token,如果存在将每个页面的请求头 header 添加 token
  if (store.state.userInfo != null) {
    //注意如果后端token没有Bearer，可以自己拼接 'Bearer ' +token,要加空格
    config.headers.Authorization = `Bearer ${store.state.userInfo}`
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 定义常见错误状态码，用于响应失败后提醒用户
const errorHandler = (status, msg) => {
  switch (status) {
    case 400:
      ElMessage.error("亲,请求语法有问题，服务器无法识别");
      break;
    case 401:
      ElMessage.error("亲,客户端未授权该请求。缺乏有效的身份认证凭证");
      break;
    case 403:
      ElMessage.error("亲,服务器拒绝响应。权限不足");
      break;
    case 404:
      ElMessage.error("亲,URL无效或者URL有效但是没有资源");
      break;
    case 500:
      ElMessage.error(msg.message);
      break;
    default:
      ElMessage.error(msg);
      break;
  }
}

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  if (response.status == 200) {
    if (response.data.code == 200) {

      ElMessage.success('亲,' + response.data.message)

    } else {
      ElMessage.error(response.data.message)
    }
  }

  //无效token
  if (response.data.code == 401) {
    ElMessageBox.confirm('亲,检测到登录状态失效...', '温馨提示', {
      confirmButtonText: '立即登录',
      cancelButtonText: '取消',
      type: "warning"
    })
      .then(() => {
        router.push("/login")
        ElMessage({
          type: 'success',
          message: '已跳转'
        });
      })
      .catch(() => {
        ElMessage({
          type: 'info',
          message: '已取消'
        });
      })
  }
  // 响应拦截进来隐藏loading效果,此处采用延时处理是合并

  // loading 请求效果,避免多次请求loading关闭又开启
  setTimeout(() => {
    hideLoading()
  }, 200)
  return response.data;
}, function (error) {
  // 对响应错误做点什么
  setTimeout(() => {
    hideLoading()
  }, 200)
  return Promise.reject(error);
});

export default instance